﻿namespace Kyoh.Lib.IO.Tasks
{
    /// <summary><see cref="FileTaskProcessor{TProfile, TProcessor}"/> に入力する、ファイル・ディレクトリへの処理内容を格納するクラス。</summary>
    /// <typeparam name="T">処理内容の詳細を格納するオブジェクト (Profile) の型。</typeparam>
    public class FileTask<T>
    {
        /// <summary><see cref="FileTask{T}"/> クラスの新しいインスタンスを初期化します。</summary>
        /// <param name="path">処理対象のファイル・ディレクトリパス。</param>
        /// <param name="pattern">ディレクトリの場合に、処理対象のファイルを表すパターン文字列。</param>
        /// <param name="recursive">ディレクトリの場合に、再帰的にサブディレクトリを処理する場合は <c>true</c>。指定された階層のみ処理する場合は <c>false</c>。</param>
        /// <param name="profile">処理内容の詳細を格納した <typeparamref name="T"/> オブジェクト。</param>
        public FileTask(string path, string pattern, bool recursive, T profile)
            : this(path, pattern, recursive, false, profile) { }

        /// <summary><see cref="FileTask{T}"/> クラスの新しいインスタンスを初期化します。</summary>
        /// <param name="path">処理対象のファイル・ディレクトリパス。</param>
        /// <param name="pattern">ディレクトリの場合に、処理対象のファイルを表すパターン文字列。</param>
        /// <param name="recursive">ディレクトリの場合に、再帰的にサブディレクトリを処理する場合は <c>true</c>。指定された階層のみ処理する場合は <c>false</c>。</param>
        /// <param name="isDirectory">指定されたパスがディレクトリの場合は <c>true</c>、それ以外の場合は <c>false</c>。</param>
        /// <param name="profile">処理内容の詳細を格納した <typeparamref name="T"/> オブジェクト。</param>
        internal FileTask(string path, string pattern, bool recursive, bool isDirectory, T profile)
        {
            this.Path = path;
            this.Pattern = pattern;
            this.Recursive = recursive;
            this.Profile = profile;
            this.IsDirectory = isDirectory;
        }
        
        /// <summary>処理対象のファイルパスを取得します。</summary>
        public string Path { get; private set; }
        /// <summary>処理対象がディレクトリの場合、抽出するファイル名のパターン文字列を取得します。</summary>
        internal string Pattern { get; private set; }
        /// <summary>処理対象がディレクトリの場合、サブディレクトリも処理するかどうかを取得します。</summary>
        internal bool Recursive { get; private set; }
        /// <summary>処理対象がディレクトリかどうかを取得します。</summary>
        internal bool IsDirectory { get; private set; }
        /// <summary>処理内容の詳細を格納した <typeparamref name="T"/> オブジェクト。</summary>
        public T Profile { get; private set; }
    }
}
